#include <iostream>
#include <list>

using namespace std;

/* 
    list 是 C++ 标准模板库（STL）中的一个序列容器，提供了双向链表的功能。
    它允许在链表的任意位置添加或删除元素。
    list 的基本操作：
    push_front(x)：在链表头部添加元素 x。
    push_back(x)：在链表尾部添加元素 x。
    pop_front()：删除链表头部元素。
    pop_back()：删除链表尾部元素。
    front()：访问链表第一个元素。
    back()：访问链表最后一个元素。
    size()：返回链表中元素的个数。
    empty()：判断链表是否为空。
    insert(pos, x)：在指定位置 pos 插入元素 x。
    erase(pos)：删除指定位置 pos 的元素。
    remove(x)：删除值为 x 的所有元素。
*/


void double_list_init() {
    int n = 7, m = 8;

    list<int> lst; // 初始化为一 int 型的空双向链表
    list<int> lstx(n); // 初始化为大小为 n 的 int 型双向链表，元素值默认初始化为 0
    list<int> lsty{1, 3, 5}; // 初始化为包含 1, 3, 5 的 int 型双向链表
    list<int> lstz(n, m); // 初始化为大小为 n 的 int 型双向链表，所有元素值均为 m
}



int main() {

    list<int> lst{10, 20, 30, 40, 50}; // 初始化为包含 10, 20, 30, 40, 50 的 int 型双向链表
    cout << "Size of lst: " << lst.size() << endl;

    cout << "lst is: empty " << (lst.empty() ? "true" : "false") << endl;

    lst.push_front(5); // 在链表头部添加元素 5
    cout << "After push_front(5), size of lst: " << lst.size() << endl;
    lst.push_back(60); // 在链表尾部添加元素 60
    cout << "After push_back(60), size of lst: " << lst.size()  << endl;

    cout << "Front element: " << lst.front() << endl; // 访问链表第一个元素
    cout << "Back element: " << lst.back() << endl; // 访问链表最后一个元素

    lst.pop_front(); // 删除链表第一个元素
    cout << "After pop_front(), size of lst: " << lst.size() << endl;
    lst.pop_back(); // 删除链表最后一个元素 

    cout << "After pop_back(), size of lst: " << lst.size() << endl;

    // 在链表中间插入元素
    auto it = lst.begin();
    advance(it, 2); // 将迭代器移动到下标为 2 的位置
    lst.insert(it, 25); // 在下标为 2 的位置插入元素 25
    cout << "After insert 25 at index 2, size of lst: " << lst.size() << endl;


    // 删除链表中间元素
    it = lst.begin();
    advance(it, 3); // 将迭代器移动到下标为 3 的位置
    lst.erase(it); // 删除下标为 3 的元素

    lst.remove(30); // 删除值为 30 的元素
    cout << "After erase element at index 3 and remove value 30, size of lst: " << lst.size() << endl;


    // 遍历链表元素
    int index = 0;
    for (int value : lst) {  
        cout << "lst[" << index++ << "] = " << value << " ,";  
    }
    cout << endl;

    return 0;
}